package com.witsight.platform.util.tools;
import org.springframework.data.domain.Pageable;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.witsight.platform.config.JsonAutoConfig;
import com.witsight.platform.util.lang.StringUtil;
/**
 * 说明：构建自定义的json对象
 * 
 * @Title: JsonUtil.java
 * @Package com.witsight.platform.util.tools
 * @See: ObjectMapper Copyright: Copyright (c) 2017 Company:sany huax witsight team by product
 * @author: penght
 * @date: 2017年9月11日 下午5:23:23
 * @version: V1.0
 *
 */
public class JsonUtil{
	/**
	 * 
	 * 说明：外部程序使用
	 * 
	 * @Title: getInstance
	 * @See: {@link #getInstance()}
	 * @author penght
	 * @return ObjectMapper
	 * @date: 2016年10月29日 下午6:27:16
	 */
	public static ObjectMapper getInstance() {
		ObjectMapper objectMapper = SpringUtil.getBean("objectMapper");
		if (objectMapper == null) {
			objectMapper = JsonUtil.createJson();
		}
		return objectMapper;
	}

	/**
	 * 
	 * 说明：对象转换json字符串
	 * 
	 * @Title: toJson
	 * @See: {@link #toJson(Object)}
	 * @author penght
	 * @param value
	 *            对象
	 * @return json字符串
	 * @date: 2016年11月2日 上午10:20:47
	 */
	public static String toJson(Object value) {
		if (value == null) {
			return "{}";
		}
		ObjectMapper objectMapper = JsonUtil.getInstance();
		String result = null;
		try {
			result = objectMapper.writeValueAsString(value);
		} catch (JsonProcessingException e) {
			e.printStackTrace();
			result = "{}";
		}
		return result;
	}

	/**
	 * 
	 * 说明：对象转换json字符串
	 * 
	 * @Title: toJson
	 * @See: {@link #toJson(Object)}
	 * @author penght
	 * @param value
	 *            对象
	 * @return json字符串
	 * @date: 2016年11月2日 上午10:20:47
	 */
	public static String toJsonFormat(Object value) {
		if (value == null) {
			return "{}";
		}
		ObjectMapper objectMapper = createJsonFormat();
		String result = null;
		try {
			result = objectMapper.writeValueAsString(value);
		} catch (JsonProcessingException e) {
			e.printStackTrace();
			result = "{}";
		}
		return result;
	}

	/**
	 * 
	 * 说明：字符串转换为对象
	 * 
	 * @Title: fromJson
	 * @See: {@link #fromJson(String, Class)}
	 * @author penght
	 * @param jsonString
	 *            json字符串
	 * @param clazz
	 *            需要解析的类
	 * @param <T>
	 *            clazz的对象范型
	 * @return 解析后的对象
	 * @date: 2016年11月2日 上午10:21:21
	 */
	public static <T> T fromJson(String jsonString, Class<T> clazz) {
		if ((StringUtil.isEmpty(jsonString)) || (!(jsonString.contains("{")))) {
			return null;
		}
		ObjectMapper objectMapper = JsonUtil.getInstance();
		T result = null;
		try {
			result = objectMapper.readValue(jsonString, clazz);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

	/**
	 * 
	 * 说明：字符串转换为对象
	 * 
	 * @Title: fromJson
	 * @See: {@link #fromJson(String, Class)}
	 * @author penght
	 * @param jsonString
	 *            json字符串
	 * @param valueTypeRef
	 *            需要解析的类
	 * @param <T>
	 *            clazz的对象范型
	 * @return 解析后的对象
	 * @date: 2016年11月2日 上午10:21:21
	 */
	public static <T> T fromJson(String jsonString, TypeReference<T> valueTypeRef) {
		if ((StringUtil.isEmpty(jsonString)) || (!(jsonString.contains("{")))) {
			return null;
		}
		ObjectMapper objectMapper = JsonUtil.getInstance();
		T result = null;
		try {
			result = objectMapper.readValue(jsonString, valueTypeRef);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}
	
	private static ObjectMapper createJson() {
		ObjectMapper objectMapper = JsonAutoConfig.create();
		return objectMapper == null ? new ObjectMapper() : objectMapper;
	}
	/**
	 * 
	 * 说明：创建json对象
	 * 
	 * @Title: createJson
	 * @See: {@link #createJson()}
	 * @author penght
	 * @return ObjectMapper
	 * @date: 2016年11月1日 下午6:59:22
	 */
	public static ObjectMapper createJsonFormat() {
		ObjectMapper objectMapper = createJson();
		objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
		return objectMapper;
	}
	/**
	 * 
	 * 说明：将数据拼成json类型的分页字符串
	 * @Title: toJsonString
	 * @See: []
	 * @author penght
	 * @param content 数据listjson字符串
	 * @param pageable 分页信息
	 * @param count 总条数
	 * @return 拼接后的json字符串
	 * @date: 2017年10月16日 上午9:49:48
	 */
	 public static String toJsonString(String content,Pageable pageable,long count){
		int size = pageable.getPageSize();
		if(size<=0) return "{\"content\":[],\"totalPages\":\"0\",\"totalElements\":\"0\",\"last\":false,\"number\":\""+pageable.getPageNumber()+"\",\"size\":\""+pageable.getPageSize()+"\",\"first\":false,\"numberOfElements\":\"0\"}";
		long scale= count/size;
		long totalPages = count%size==0?scale:scale+1;
		return String.format("{\"content\":%s,\"totalPages\":\"%d\",\"totalElements\":\"%d\",\"last\":%b,\"number\":\"%d\",\"size\":\"%d\",\"first\":%b,\"numberOfElements\":\"%d\"}"
				, content,totalPages,count,(pageable.getPageNumber()==totalPages-1),
				pageable.getPageNumber(),size,(pageable.getPageNumber()==1),pageable.getPageNumber()*size);
	}
}